/*
 * @Author: 0x9DEFA478
 * @Date: 2021-09-19 16:39:20
 * @LastEditTime: 2021-12-17 23:10:37
 * @LastEditors: 0x9DEFA478
 * @Description: 
 * QQ:2652450237
 * ============================================================================================================================================
 * 
 * 
 * 
 *                                                                                               ************      ****************************
 *                                                                                             ************      ****************************  
 *                                                                                           ************      ****************************    
 *                                                                                         ************      ****************************      
 *                                                                                       ************      ************                        
 *                                                                                     ************      ************                          
 *                                                                                   ************      ************                            
 *                                                                                 ************      ************                              
 *                                                                               ************      ************                                
 *                                                                             ************      ************                                  
 *                                                                           ************      ************                                    
 *                                                                         ************      ************                                      
 *                                                                       ************      ************                                        
 *                                                                     ************      ************                                          
 *                                                                   ************      ************                                            
 *                                                                 ************      ************                                              
 *                                                               ************      ************                                                
 *                                                             ************      ************                                                  
 *                                                           ************      ************                                                    
 *                                                         ************      ************                                                      
 *                                                       ************      ************                                                        
 *                                                     ************      ************                                                          
 *                                                   ************      ************                                                            
 *                                                 ************      ************                                                              
 *                                               ************      ************                                                                
 *                                             ************      ************                                                                  
 *                                           ************      ************                                                                    
 *                                         ************      ************                                                                      
 *                                       ************      ************                                                                        
 *                                     ************      ************                                                                          
 *                                   ************      ************                                                                            
 *                                 ************      ************                                                                              
 *                               ************      ************                                                                                
 *                             ************      ************                                                                                  
 *                           ************      ************                                                                                    
 *                         ************      ************                                                                                      
 *       ****************************      ************                                                                                        
 *     ****************************      ************                                                                                          
 *   ****************************      ************                                                                                            
 * ****************************      ************                                                                                              
 * 
 * 
 * 
 * ============================================================================================================================================
 * 
 */
#ifndef __IP_MDMA_H_
#define __IP_MDMA_H_
#include "mdma.h"



typedef struct{
  union{
    struct{
      unsigned int SINC:2;//0:源地址指针固定 1:源地址指针递增 2:源地址指针递减
      unsigned int DINC:2;//0:目标地址指针固定 1:目标地址指针递增 2:目标地址指针递减
      unsigned int SSIZE:2;//源数据大小 0:字节 1:半字 2:字 3:双字
      unsigned int DSIZE:2;//目标数据大小 0:字节 1:半字 2:字 3:双字
      unsigned int SINCOS:2;//源增量偏移量 0:字节 1:半字 2:字 3:双字
      unsigned int DINCOS:2;//目标增量偏移量 0:字节 1:半字 2:字 3:双字
      unsigned int SBURST:3;//0:单次传输 其他:2^N个节拍的突发 最大为16个节拍
      unsigned int DBURST:3;//0:单次传输 其他:2^N个节拍的突发 最大为16个节拍
      unsigned int TLEN:7;//传输长度为TLEN+1 源长度 传输长度要大于突发大小
      unsigned int PKE:1;//0:按原样将源数据写入到目标中。如果源大小小于目标大小，则会根据 PAM 值进行填充。 1:将源数据封装/解封为目标数据大小。所有数据均右对齐 (采用小端模式)。
      
      // 情况 1：源数据大小小于目标数据大小
      // 0:右对齐，用 0 进行填充（默认值）
      // 1:右对齐，符号扩展
      // 2:左对齐（用 0 进行填充）
      // 3:保留
      // 情况 2：源数据大小大于目标数据大小。
      // 0:右对齐——只会将源的 LSB 部分写入到目标地址
      // 2:左对齐——只会将源的 MSB 部分写入到目标地址
      // 其余部分将被丢弃。
      unsigned int PAM:2;

      // 0:每个 MDMA 请求（软件或硬件）都会触发缓冲区传输
      // 1:每个 MDMA 请求（软件或硬件）都会触发块传输
      // 2:每个 MDMA 请求（软件或硬件）都会触发重复块传输 (如果块重复值为 0，则会传输单块)
      // 3:每个 MDMA 请求（软件或硬件）都会触发针对相应通道的完整数据（例如链表）传输，直至通道结束传输并被禁止。
      unsigned int TRGM:2;
      unsigned int SWRM:1;//0:硬件请求与软件请求有效 1:仅软件请求有效
      unsigned int BWM:1;//0:写不可缓冲 1:写可缓冲
    }Bit;
    unsigned int Val;
  }TCR;

  union{
    struct{
      unsigned int BNDT:17;//0~65536 块传输大小(字节) 源长度
      unsigned int _Res0:1;
      unsigned int BRSUM:1;//0:更新时源地址相加 1:更新时源地址相减
      unsigned int BRDUM:1;//0:更新时目标地址相加 1:更新时目标地址相减
      unsigned int BRC:12;//重复块数
    }Bit;
    unsigned int Val;
  }BNDTR;

  union{
    unsigned int Val;//源地址
  }SAR;

  union{
    unsigned int Val;//目标地址
  }DAR;

  union{
    struct{
      unsigned int SUV:16;//块传输源地址变化量
      unsigned int DUV:16;//块传输目标地址变化量
    }Bit;
    unsigned int Val;
  }BRUR;

  union{
    unsigned int Val;//下一个表的地址
  }LAR;

  union{
    struct{
      unsigned int TSEL:6;//触发选择
      unsigned int _Res0:10;
      unsigned int SBUS:1;//0:系统/AXI总线 1: AHB总线/TCM
      unsigned int DBUS:1;//0:系统/AXI总线 1: AHB总线/TCM
      unsigned int _Res1:14;
    }Bit;
    unsigned int Val;
  }TBR;

  union{
    unsigned int Val;
  }MAR;

  union{
    unsigned int Val;
  }MDR;
  
}IP_MDMA_TransferList;

#define vIP_MDMA_Golbal_NumOfChannel                              16

typedef struct{
  struct{
    MDMA_TypeDef* Instance;
  }Instance;

  struct{
    void* volatile v;
    void (* volatile Callback)(void*);
  }Callbacks[vIP_MDMA_Golbal_NumOfChannel];
}IP_MDMA_Golbal;

typedef struct{

  IP_MDMA_Golbal* mdma_golbal;

  struct{
    MDMA_Channel_TypeDef* Instance;
  }Instance;

  int Channelx;
  unsigned int GIFx;

  
}IP_MDMA;




/**
 * @brief MDMA全局初始化
 * @param ip_mdma_golbal 要初始化的IP_MDMA对象
 * @param _mdma mdma句柄
 * @return 无
 */
void IP_MDMA_GlobalInit(IP_MDMA_Golbal* ip_mdma_golbal,MDMA_TypeDef* _mdma);

/**
 * @brief MDMA句柄初始化
 * @param ip_mdma 指向一个内存空间,将其初始化成IP_MDMA句柄
 * @param ip_mdma_golbal MDMA总句柄
 * @param _mdma mdma句柄
 * @return 无
 */
void IP_MDMA_Init(IP_MDMA* ip_mdma,IP_MDMA_Golbal* ip_mdma_golbal,MDMA_Channel_TypeDef* _mdma);




/**
 * @brief MDMA中断调用
 * @param v IP_MDMA_Golbal句柄
 * @return 无
 */
void IP_MDMA_IRQ(void* v);

/**
 * @brief 设置中断回调
 * @param ip_mdma IP_MDMA句柄
 * @param Callback 中断回调
 * @param v 中断回调传入的参数
 * @return 无
 */
void IP_MDMA_SetChannelIrqCallback(IP_MDMA* ip_mdma,void (*Callback)(void*),void* v);

/**
 * @brief 挂载传输链表
 * @param ip_mdma mdma句柄
 * @param List 链表信息
 * @return 无
 */
void IP_MDMA_LoadList(IP_MDMA* ip_mdma,IP_MDMA_TransferList* List);

#endif //__IP_MDMA_H_
